#include "usart1_2.h"

uint8_t   USART1_RX_BUFF[USART1_RX_BUFF_LENGTH];
uint8_t   USART1_TX_BUFF[USART1_TX_BUFF_LENGTH];

uint8_t   USART2_RX_BUFF[USART2_RX_BUFF_LENGTH];
uint8_t   USART2_TX_BUFF[USART2_TX_BUFF_LENGTH];

//uint16_t  USART1_data_dma_head=0;      //数据头部
//uint16_t  USART1_data_dma_rear=0;       //数据尾部

//uint16_t  USART2_data_dma_head;      //数据头部
//uint16_t  USART2_data_dma_rear;       //数据尾部

//uint16_t  USART1_data_dma_length;     //串口1dma数据接收总长度
//uint16_t  USART2_data_dma_length;     //串口2dma数据接收总长度

//串口不定长收发，半中断全中断拷贝数据，发生空闲中断时，证明数据一帧完成接受



void USART_SET_INIT(void)
{
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);                                                       //使能空闲中断
    HAL_UART_Receive_DMA(&huart1,USART1_RX_BUFF,USART1_RX_BUFF_LENGTH);   //使能串口接收DMA
	  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);                                                       //使能空闲中断
    HAL_UART_Receive_DMA(&huart2,USART2_RX_BUFF,USART2_RX_BUFF_LENGTH);   //使能串口接收DMA
}

void test(void)
{   
    HAL_UART_Transmit_DMA(&huart1,USART1_TX_BUFF,10);  
}


uint8_t  aaa;

//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
//	if(huart->Instance==USART1)
//	{
//		    //aaa++;
//	}
//}
uint16_t IDLE_datalength=0;
void USART1_IRQ_IDLE_CALLBACK(void)
{
		/* USER CODE BEGIN USART1_IRQn 0 */
		if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)==SET)   //判断是否是空闲中断
		{
			  __HAL_UART_CLEAR_IDLEFLAG(&huart1);                                 //清楚空闲中断标志
				
			  //当空闲中断发生时
				//获取数据长度
				IDLE_datalength=USART1_RX_BUFF_LENGTH-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
				
		    //空闲中断位置就是队尾
        queue_in_dma(IDLE_datalength,&USART1_RX_queue);

		}
		    
		
			  //HAL_UART_DMAStop(&huart1); //  停止DMA传输				
			  //receive_num=MAX_BUF-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
			 	//HAL_UART_Receive_DMA(&huart1,u1_rec_buf,MAX_BUF);//重新打开DMA接收
	
}

void USART1_XferHalfCpltCallback2(DMA_HandleTypeDef *hdma)
{
   	//a=__HAL_DMA_GET_COUNTER(hdma);
    if(__HAL_DMA_GET_FLAG(hdma,DMA_FLAG_HT5) != RESET)
		//半中断，意味着前一半的数据可以使用
    {
         queue_in_dma(USART1_RX_BUFF_LENGTH/2-1,&USART1_RX_queue);  
		}
		else if(__HAL_DMA_GET_FLAG(hdma,DMA_FLAG_TC5) != RESET)
		//全中断，意味着后一半数据可用
		{
		     queue_in_dma(USART1_RX_BUFF_LENGTH-1,&USART1_RX_queue);   
		}
}

void USART2_IRQ_IDLE_CALLBACK(void)
{
		/* USER CODE BEGIN USART1_IRQn 0 */
		if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)==SET)   //判断是否是空闲中断
		{
			  __HAL_UART_CLEAR_IDLEFLAG(&huart2);                                 //清楚空闲中断标志
				
			  //当空闲中断发生时
				//获取数据长度
				IDLE_datalength=USART2_RX_BUFF_LENGTH-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
				
		    //空闲中断位置就是队尾
        queue_in_dma(IDLE_datalength,&USART2_RX_queue);

		}
		    
		
			  //HAL_UART_DMAStop(&huart1); //  停止DMA传输				
			  //receive_num=MAX_BUF-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
			 	//HAL_UART_Receive_DMA(&huart1,u1_rec_buf,MAX_BUF);//重新打开DMA接收
	
}

void USART2_XferHalfCpltCallback2(DMA_HandleTypeDef *hdma)
{
   	//a=__HAL_DMA_GET_COUNTER(hdma);
    if(__HAL_DMA_GET_FLAG(hdma,DMA_FLAG_HT5) != RESET)
		//半中断，意味着前一半的数据可以使用
    {
         queue_in_dma(USART2_RX_BUFF_LENGTH/2-1,&USART2_RX_queue);  
		}
		else if(__HAL_DMA_GET_FLAG(hdma,DMA_FLAG_TC5) != RESET)
		//全中断，意味着后一半数据可用
		{
		     queue_in_dma(USART2_RX_BUFF_LENGTH-1,&USART2_RX_queue);   
		}
}


